package ListNodePractice;

public class CircleListNode_1 {
    /**
     * 环形链表 II
     * 给定一个链表，返回链表开始入环的第一个节点。如果链表无环，则返回null。
     *
     * 如果链表中有某个节点，可以通过连续跟踪 next 指针再次到达，则链表中存在环。 为了表示给定链表中的环，评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。如果 pos 是 -1，则在该链表中没有环。注意：pos 不作为参数进行传递，仅仅是为了标识链表的实际情况。
     * @param head
     * @return
     */
    public ListNode detectCycle(ListNode head) {
        if(head == null){
            return null;
        }
        //定义快慢指针
        ListNode fastListNode = head;
        ListNode slowListNode = head;
        Boolean flag = false;
        while(fastListNode.next != null && fastListNode.next.next!=null){
            slowListNode = slowListNode.next;
            fastListNode = fastListNode.next.next;
            if(slowListNode == fastListNode){
                flag = true;
                break;
            }
        }
        //如果有环形列表定义一个初始化节点，让初始的节点和两者相交的慢节点都一起往下走当两者再次相遇的时候就找到环形的初始节点
        if(flag){
            ListNode pre = head;
            while(pre != slowListNode){
                pre = pre.next;
                slowListNode = slowListNode.next;
            }
            return pre;
        }else{
            return null;
        }
    }
}
